package com.atguigu.config;

import com.atguigu.aop.LogAspects;
import com.atguigu.aop.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * @Author:zwy
 * @Despriction: 指在程序运行期间动态的将某段代码切入到指定方法的位置进行的编程方式
 * Aop【动态代理】
 * 导入AOP模块
 * 前置通知(@Before)
 * 后置通知(@After) 无论方法正常结束还是异常结束都i会执行
 * 返回通知(@AfterReturning)
 * 异常通知(@AfterThrowing)
 * 环绕通知(@Around)
 * 将切面类和业务逻辑类（目标方法都加入到容器中）
 * 必须告诉spring这个是一个切面类（给切面类上加上一个注解@Aspect ）
 * 给配置类加一个开启基于注解的AOP模式 @EnableAspectJAutoProxy
 * 定义一个业务逻辑类 在业务逻辑运行的时候进行日志打印 方法异常
 * @Date:Create in 11:01 2018/7/10
 * @Modify By:
 *
 * 三部
 * 1）将业务逻辑类和切面类加入容器告诉spring那个是切面类（@Aspect）
 * 2) 在切面类的每一个通知方法上标注通知注解 注意切点表达式的书写
 * 3）开启切面的注解模式@EnableAspectJAutoProxy
 *
 *
 * AOP原理：【给容器中注册了说明组件 这个组件什么时候工作】
 *  @EnableAspectJAutoProxy
 *
 *@Import(AspectJAutoProxyRegistrar.class)给容器中导入
 *利用AspectJAutoProxyRegistrar自定义给容器中注册bean
 * org.springframework.aop.config.internalAutoProxyCreator" = AnnotationAwareAspectJAutoProxyCreator
    给容器中注册一个AnnotationAwareAspectJAutoProxyCreator
        -》AspectJAwareAdvisorAutoProxyCreator
 ·············-》AbstractAdvisorAutoProxyCreator
 ·················-》AbstractAutoProxyCreator
 ·······················-》 implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
 ··························关注后置处理器（在bean初始化完成前后做事情）、自动装配BeanFactory
AbstractAutoProxyCreator.setBeanFactory(BeanFactory beanFactory)

AbstractAutoProxyCreator.后置处理器的逻辑

 流程 ：
        1）传入配置类，创建ioc容器
 ·      2）注册配置类,调用refresh()刷新容器
        3）registerBeanPostProcessors(beanFactory);注册bean的后置处理器来拦截bean的创建
                1）先获取容器中已经定义的需要创建的对象所有的BeanPostProcessor

 */

@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {
    //业务逻辑类加入容器中
    @Bean
    public MathCalculator calculator(){
        return new MathCalculator();
    }
    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}
